<?php

/**
 * Created by PhpStorm.
 * User: PX780
 * Date: 2016/10/30
 * Time: 21:02
 */
class myuploadimg{
    protected $fileMine = ['image/jpg', 'image/jpeg', 'image/png', 'image/gif', 'image/wbmp'];//文件上传类型
    protected $filepath;//文件上传路径
    protected $filemax;//文件上传大小
    protected $fileExt=['jpg', 'jpeg', 'png', 'gif', 'wbmp'];//文件上传格式
    protected $filename;//文件名
    protected $fileerror;//文件出错设置
    protected $fileflag;//文件检测
    protected $fileinfo; //FILES
    protected $ext; //文件扩展
    protected $path;
    protected $savename;//上传后保存的名称
//文件上传
    public function __construct($filename,$filepath,$savename="",$filemax=20000000,$fileflag=true)
    {
        $this->filename = $filename;
        $this->fileinfo = $_FILES[$this->filename];
        $this->filemax = $filemax;
        $this->fileflag = $fileflag;
        $this->savename = $savename;
        $this->fileerror = "";
        if ($this->savename == "") {
            $this->savename = $this->Upname();
        }
        $this->filepath = $filepath;
    }

    public function debug()
    {
        echo "filename:";
        print_r($this->filename);
        echo "<br/>fileinfo:";
        print_r($this->fileinfo);
        echo "<br/>filemax:";
        print_r($this->filemax);
        echo "<br/>fileflag:";
        print_r($this->fileflag);
        echo "<br/>fileExt:";
        print_r($this->fileExt);
        echo "<br/>fileMine:";
        print_r($this->fileMine);
        echo "<br/>savename:";
        print_r($this->savename);
        echo "<br/>filepath:";
        print_r($this->filepath);
        echo "<br/>ext:";
        print_r($this->ext);
        echo "<br/>path:";
        print_r($this->path);
        echo "<br/>fileerror:";
        print_r($this->fileerror);
    }

//错误判断
    public function UpError(){
        if($this->fileinfo['error']>0){
            switch($this->fileinfo['error'])
            {
                case 1:
                    $this->fileerror="上传文件大小超过服务器允许上传的最大值，php.ini中设置upload_max_filesize选项限制的值 ";
                    break;
                case 2:
                    $this->fileerror="上传文件大小超过HTML表单中隐藏域MAX_FILE_SIZE选项指定的值";
                    break;
                case 3:
                    $this->fileerror="文件部分被上传";
                    break;
                case 4:
                    $this->fileerror="没有选择上传文件";
                    break;
                case 5:
                    $this->fileerror="未找到临时目录";
                    break;
                case 6:
                    $this->fileerror="文件写入失败";
                    break;
                case 7:
                    $this->fileerror="php文件上传扩展没有打开 ";
                    break;
                case 8:
                    $this->fileerror="";
                    break;
            }
            return false;
        }
        return true;
    }
//检测文件类型
    public function UpMine(){
        if(!in_array($this->fileinfo['type'],$this->fileMine)) {
            $this->fileerror="文件上传类型不对";
            return false;
        }
        return true;
    }
//检测文件格式
    public function UpExt(){
        $this->ext=pathinfo($this->fileinfo['name'],PATHINFO_EXTENSION);
        if(!in_array($this->ext,$this->fileExt)){
            $this->fileerror="文件格式不对";
            return false;
        }
        return true;
    }
//检测文件路径
    public function UpPath(){
        if(!file_exists($this->filepath)){
            mkdir($this->filepath,0777,true);
        }
    }
//检测文件大小
    public function UpSize(){
        $max=$this->fileinfo['size'];
        if($max>$this->filemax){
            $this->fileerror="文件过大";
            return false;
        }
        return true;
    }
//检测文件是否HTTP
    public function UpPost(){
        if(!is_uploaded_file($this->fileinfo['tmp_name'])){
            $this->fileerror="恶意上偿还";
            return false;
        }
        return true;
    }

    public function GetFileerror()
    {
        return $this->fileerror;
    }

//文件名防止重复
    public function Upname(){
        return md5(uniqid(microtime(true),true));
    }
//图片缩略图

//文件双传
    public function uploads()
    {
        if($this->UpError()&&$this->UpMine()&&$this->UpExt()&&$this->UpSize()&&$this->UpPost()){
            $this->UpPath();
            $this->path=$this->filepath.'/'. $this->savename.'.'.$this->ext;
            if(move_uploaded_file($this->fileinfo['tmp_name'], $this->path)){
                return $this->path;
            }else{
                if($this->fileerror == "")
                {
                    $this->fileerror="上传失败";
                }
                return false;
            }
        }else{
            return false;
        }
    }

    /**
     * 生成缩略图
     * @author yangzhiguo0903@163.com
     * @param string     源图绝对完整地址{带文件名及后缀名}
     * @param string     目标图绝对完整地址{带文件名及后缀名}
     * @param int        缩略图宽{0:此时目标高度不能为0，目标宽度为源图宽*(目标高度/源图高)}
     * @param int        缩略图高{0:此时目标宽度不能为0，目标高度为源图高*(目标宽度/源图宽)}
     * @param int        是否裁切{宽,高必须非0}
     * @param int/float  缩放{0:不缩放, 0<this<1:缩放到相应比例(此时宽高限制和裁切均失效)}
     * @return boolean
     */
    function Img2thumb($dst_img, $width = 75, $height = 75, $cut = 0, $proportion = 0)
    {
        $src_img = $this->path;
        if(!is_file($src_img))
        {
            return false;
        }
        $ot = pathinfo($dst_img, PATHINFO_EXTENSION);
        $otfunc = 'image' . ($ot == 'jpg' ? 'jpeg' : $ot);
        $srcinfo = getimagesize($src_img);
        $src_w = $srcinfo[0];
        $src_h = $srcinfo[1];
        $type  = strtolower(substr(image_type_to_extension($srcinfo[2]), 1));
        $createfun = 'imagecreatefrom' . ($type == 'jpg' ? 'jpeg' : $type);

        $dst_h = $height;
        $dst_w = $width;
        $x = $y = 0;

        /**
         * 缩略图不超过源图尺寸（前提是宽或高只有一个）
         */
        if(($width> $src_w && $height> $src_h) || ($height> $src_h && $width == 0) || ($width> $src_w && $height == 0))
        {
            $proportion = 1;
        }
        if($width> $src_w)
        {
            $dst_w = $width = $src_w;
        }
        if($height> $src_h)
        {
            $dst_h = $height = $src_h;
        }

        if(!$width && !$height && !$proportion)
        {
            return false;
        }
        if(!$proportion)
        {
            if($cut == 0)
            {
                if($dst_w && $dst_h)
                {
                    if($dst_w/$src_w> $dst_h/$src_h)
                    {
                        $dst_w = $src_w * ($dst_h / $src_h);
                        $x = 0 - ($dst_w - $width) / 2;
                    }
                    else
                    {
                        $dst_h = $src_h * ($dst_w / $src_w);
                        $y = 0 - ($dst_h - $height) / 2;
                    }
                }
                else if($dst_w xor $dst_h)
                {
                    if($dst_w && !$dst_h)  //有宽无高
                    {
                        $propor = $dst_w / $src_w;
                        $height = $dst_h  = $src_h * $propor;
                    }
                    else if(!$dst_w && $dst_h)  //有高无宽
                    {
                        $propor = $dst_h / $src_h;
                        $width  = $dst_w = $src_w * $propor;
                    }
                }
            }
            else
            {
                if(!$dst_h)  //裁剪时无高
                {
                    $height = $dst_h = $dst_w;
                }
                if(!$dst_w)  //裁剪时无宽
                {
                    $width = $dst_w = $dst_h;
                }
                $propor = min(max($dst_w / $src_w, $dst_h / $src_h), 1);
                $dst_w = (int)round($src_w * $propor);
                $dst_h = (int)round($src_h * $propor);
                $x = ($width - $dst_w) / 2;
                $y = ($height - $dst_h) / 2;
            }
        }
        else
        {
            $proportion = min($proportion, 1);
            $height = $dst_h = $src_h * $proportion;
            $width  = $dst_w = $src_w * $proportion;
        }

        $src = $createfun($src_img);
        //$dst = imagecreatetruecolor($width ? $width : $dst_w, $height ? $height : $dst_h);
        $dst = imagecreatetruecolor($dst_w, $dst_h);
        $white = imagecolorallocate($dst, 255, 255, 255);
        imagefill($dst, 0, 0, $white);

        if(function_exists('imagecopyresampled'))
        {
            imagecopyresampled($dst, $src, $x, $y, 0, 0, $dst_w, $dst_h, $src_w, $src_h);
        }
        else
        {
            imagecopyresized($dst, $src, $x, $y, 0, 0, $dst_w, $dst_h, $src_w, $src_h);
        }
        $otfunc($dst, $dst_img);
        imagedestroy($dst);
        imagedestroy($src);
        return true;
    }
}
?>